www.gusucode.com > 有关虹膜特征提取的部分很有借鉴意义源码程序 > iris recognition.txt
function iris(filename); im=(rgb2gray(imread(filename))); im=im(13:288, 1:342); j=double(im); [d1 d2]=size(j); f=0; %stand out iris-pupil by contrasting LOW=3; HIGH=175; for loop=1:2:LOW*2 for loop1=1:d1 for loop2=1:d2 if j(loop1,loop2)<LOW+loop j(loop1,loop2)=0; elseif j(loop1,loop2)>HIGH-loop j(loop1,loop2)=255; else j(loop1,loop2)=round(j(loop1,loop2)/(HIGH-LOW- 2*loop)*255); end end end end % filter bright pixels by using threshold brightness threshold=200; %f=f+1; figure(f), imshow(j), imagesc(j); 29 Appendix B pupil= (j < threshold); %f=f+1; figure(f), imshow(pupil), imagesc(pupil); %filtering using area of a whole circle diameter=33; mid=(diameter+1)/2; bound=mid-1; con=7; dif=(con+1)/2-1; result=zeros(d1-mid, d2-mid); circle=imcircle(diameter); replace=imcircle(con); area=(diameter/2)^2*pi; for loop1 = 1 : d1 for loop2 = 1 : d2 if (loop1<mid | loop1>d1-mid | loop2<mid | loop2>d2-mid) result(loop1,loop2)=0; else acc=0; compare=pupil(loop1-bound : loop1+bound, loop2-bound : loop2+bound); prod = circle.*compare; acc=sum(sum(prod)); if acc / area > 0.85 result(loop1-dif: loop1+dif, loop2-dif: loop2+dif) = ones(con,con); else result(loop1,loop2)=0; end end end end iris=result; [d1 d2]=size(iris); %approximate center using weight centroid of pixels column_weights = [1:d2] .* sum(iris); column_centroid = round(sum(column_weights(:)) / sum(iris(:))); row_weights = [1:d1] .* sum(iris, 2)'; row_centroid = round(sum(row_weights(:)) / sum(iris(:))); f=f+1; figure(f), imshow(im),imagesc(im);pixval; %line([column_centroid, column_centroid], [1, d1]); %line([1, d2], [row_centroid, row_centroid]); %darken pupil im2=im; for loop=1:5 im2=histeq(im2); for loop1=1:d1 for loop2=1:d2 if im2(loop1,loop2)<50+loop*10 im2(loop1,loop2)=0; elseif im2(loop1,loop2)>160-loop*10 im2(loop1,loop2)=255; end end end end 30 Appendix B %find boundary of pupil using sudden change in sum of brightness of concentric circles im2=double(im2); pupilbound=73; centers=0; dev=2; pupilser=zeros((dev*2+1)^2, (pupilbound+1)/2); for loop1=-dev:dev for loop2=-dev:dev centers=centers+1; for loop3=1:2:pupilbound circle=double(bwperim(imcircle(loop3))); pupilser(centers,(loop3+1)/2) = sum(sum(im2(row_centroid+loop1-(loop3-1)/2:row_centroid+loop1+(loop3- 1)/2 , column_centroid+loop2-(loop3- 1)/2:column_centroid+loop2+(loop3- 1)/2).*circle))/sum(sum(circle))*128; end end end pupilser=pupilser'; inner=zeros((pupilbound+1)/2, (dev*2+1)^2); for loop1=1 : (dev*2+1)^2 check=0; radius=-1; for loop2=1 : (pupilbound+1)/2 radius=radius+1; check=check+pupilser(loop2,loop1); if check > 0 inner(loop2,loop1)=check; inner(loop2+1:(pupilbound+1)/2,loop1)=0; % inner(2,loop1)=radius; break; end end end [a1,b1]=max(inner); %a1=max of gradient in each test center, b1 is the correspond radius [a2,b2]=max(a1); %a2=max of all the gradients so b2 = correspoding test center pupilcenter=b2; pupilradius=b1(b2); %b2 is the center and b1(b2) is the center's radius pupilcenter_x=column_centroid+(-(dev+1)+rem(pupilcenter,dev*2+1)); pupilcenter_y=row_centroid+-((dev+1)-((pupilcenter - rem(pupilcenter,dev*2+1)) / (dev*2+1)+1)); hold on; o=0:.01:2*pi; plot(pupilradius*cos(o)+pupilcenter_x, pupilradius*sin(o)+pupilcenter_y); ph=line([pupilcenter_x, pupilcenter_x], [pupilcenter_y -10, pupilcenter_y+10]); pv=line([pupilcenter_x-10, pupilcenter_x+10], [pupilcenter_y, pupilcenter_y]); hold off; f=f+1; figure(f); plot((pupilser)); %find iris boundary %darken iris im2=im; 31 Appendix B for loop=1:5 im2=histeq(im2); for loop1=1:d1 for loop2=1:d2 if im2(loop1,loop2)<60+loop*10 im2(loop1,loop2)=0; elseif im2(loop1,loop2)>170-loop*10 im2(loop1,loop2)=255; end end end end im2=double(im2); irisbound=163; centers=0; dev=2; irisser=zeros((dev*2+1)^2, (irisbound+1)/2); for loop1=-dev:dev for loop2=-dev:dev counter=(pupilbound+1)/2-1; centers=centers+1; jump=0; for loop3=pupilbound:2:irisbound counter=counter+1; jump=jump+2; circle=double(bwperim(imcircle(loop3))); circle(1:(loop3+1)/2-(pupilbound+1)/2, :)=0; circle((loop3+1)/2+(pupilbound+1)/2:loop3, :)=0; irisser(centers,counter) = sum(sum(im2(pupilcenter_y+loop1 - ((loop3+1)/2-1):pupilcenter_y+loop1+((loop3+1)/2-1) , pupilcenter_x+loop2-((loop3+1)/2-1) : pupilcenter_x+loop2+((loop3+1)/2-1)).*circle))/sum(sum(circle))*128; end end end irisser=irisser'; irisgrad=gradient(irisser'); irisgrad=irisgrad'; [g1,g2]=size(irisgrad); for loop1=g1 for loop2=g2 if irisgrad(loop1,loop2)<0 irisgrad(loop1,loop2)=0; end end end [i1,j1]=max(irisgrad); %i1=max of gradient in each test center, j1 is the correspond radius [i2,j2]=max(i1); %i2=max of all the gradients so j2 = correspoding test center iriscenter=j2; irisradius=j1(j2); iriscenter_x=pupilcenter_x+(-(dev+1)+rem(iriscenter,dev*2+1)); iriscenter_y=pupilcenter_y+-((dev+1)-((iriscenter - rem(iriscenter,dev*2+1)) / (dev*2+1)+1)); 32 Appendix B figure(1); hold on; o=0:.01:2*pi; plot(irisradius*cos(o)+iriscenter_x, irisradius*sin(o)+iriscenter_y,'r'); ih=line([iriscenter_x-20, iriscenter_x+20], [iriscenter_y+20, iriscenter_y-20]); iv=line([iriscenter_x-20, iriscenter_x+20], [iriscenter_y-20, iriscenter_y+20]); set(ih,'color',[1 0 0]); set(iv,'color',[1 0 0]); l1=line([pupilcenter_x, iriscenter_x], [pupilcenter_y+pupilradius, iriscenter_y+irisradius]); l2=line([pupilcenter_x+pupilradius, iriscenter_x+irisradius], [pupilcenter_y, iriscenter_y]); l3=line([pupilcenter_x, iriscenter_x], [pupilcenter_y -pupilradius, iriscenter_y-irisradius]); l4=line([pupilcenter_x-pupilradius, iriscenter_x-irisradius], [pupilcenter_y, iriscenter_y]); set(l1,'color',[1 1 0]); set(l2,'color',[1 1 0]);set(l3,'color',[1 1 0]); set(l4, 'color',[1 1 0]); line; hold off;